﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Web.Services;
using BonesoftWeb.Utils;
using Business;
using Business.Entity.Contabil.Pessoa;
using Business.Entity.Estoque.Produto;
using Business.Entity.Estoque.Produto.ClassesRelacionadas;
using Business.Entity.Fiscal;
using Business.Entity.Fiscal.ClassesRelacionadas;
using Business.Entity.Sped;
using Business.Enum;
using DevExpress.Web.ASPxGridView;
using DevExpress.Web.Data;

namespace BonesoftWeb.Paginas
{
    public partial class PageNotaFiscal : PageBase
    {

        protected void Page_Load(object sender, EventArgs e)
        {

            IsProdutoSelecionado();
            Page.DataBind();
        }

        protected bool IsProdutoSelecionado()
        {

            if (ProdutoSelecionado.Id == 0)
            {
                pnlInformacoesCompraProduto.Visible = false;
                cmdBuscaProduto.Visible = true;
                cmdAlterarProduto.Visible = true;
                cmdAddProduto.Visible = true;
                return false;
            }
            else
            {
                pnlInformacoesCompraProduto.Visible = true;
                cmdBuscaProduto.Visible = false;
                cmdAddProduto.Visible = true;
                cmdAlterarProduto.Visible = false;
                return true;
            }

        }

        public Pessoa Emissor
        {
            get
            {
                if (Validation.IsCNPJValid(txtCnpjEmissor.Text))
                {
                    var p = PessoaRepository.GetUniqueByCpfCnpj(txtCnpjEmissor.Text);
                    if (p == null)
                    {
                        return new Pessoa();
                    }
                    return p;
                }
                else return new Pessoa();
            }
        }

        public Pessoa Transportadora
        {
            get
            {

                if (Validation.IsCNPJValid(txtCnpjTransportadora.Text))
                {
                    var p = PessoaRepository.GetUniqueByCpfCnpj(txtCnpjTransportadora.Text);
                    if (p == null)
                    {
                        return new Pessoa();
                    }
                    return p;
                }
                else return new Pessoa();
            }
        }

        public List<NotaFiscalPagamento> Pagamento
        {
            get
            {
                return null;
            }
        }

        public List<ProdutoNotaFiscal> Produtos
        {
            get
            {
                if (gridProdutoNotaFiscal.DataSource == null)
                {
                    return new List<ProdutoNotaFiscal>();
                }
                return (List<ProdutoNotaFiscal>)gridProdutoNotaFiscal.DataSource;
            }
        }

        protected NotaFiscal Nota
        {
            get
            {
                NotaFiscal nf = null;
                if (txtIdNota.Text.Equals("") || txtIdNota.Text.Equals("0"))
                {
                    nf = new NotaFiscal()
                    {
                        Produtos = new List<ProdutoNotaFiscal>(),
                        Pagamento = new List<NotaFiscalPagamento>()
                    };
                }
                else nf = NotaFiscalRepository.GetById(int.Parse(txtIdNota.Text));
                nf.DataEmissao = dtEmissao.Date;
                nf.DataEntrada = dtEntrada.Date;
                nf.Numero = GetInt(txtNumero.Text);
                nf.Serie = txtSerie.Text;
                nf.Modelo = ModeloNotaFiscal;
                nf.Produtos = Produtos;
                nf.Pagamento = Pagamento;
                return nf;
            }
        }

        protected NaturezaInterna NaturezaInterna
        {
            get
            {
                var id = GetInt(cboNaturezaInterna.Value);
                if (id != 0)
                {
                    return NaturezaInternaRepository.GetById(id);
                }
                return null;
            }
        }

        protected CFOP Cfop
        {
            get
            {
                var id = GetInt(cboCfop.Value);
                if (id != 0)
                {
                    return CfopRepository.GetById(id);
                }
                return null;
            }
        }

        protected Ncm Ncm
        {
            get
            {
                var id = GetInt(cboNcmProduto.Value);
                if (id != 0)
                {
                    return NcmRepository.GetById(id);
                }
                return null;
            }
        }

        protected CST Cst
        {
            get
            {
                var id = GetInt(cboCstProduto.Value);
                if (id != 0)
                {
                    return CSTRepositorio.GetById(id);
                }
                return null;
            }
        }

        protected Unidade Unidade
        {
            get
            {
                var id = GetInt(cboUnidadeProduto.Value);
                if (id != 0)
                {
                    return UnidadeRepository.GetById(id);
                }
                return null;
            }
        }
        protected ModeloNotaFiscal ModeloNotaFiscal
        {
            get
            {
                if (cboModelo.Value == null)
                {
                    return new ModeloNotaFiscal();
                }
                return (ModeloNotaFiscal)new DicionaryConverter(typeof(ModeloNotaFiscal)).ConvertBack(cboModelo.Value);
            }
        }

        protected Produto ProdutoSelecionado
        {
            get
            {
                var id = GetInt(txtIdProduto.Text);

                if (id == 0)
                {
                    return new Produto()
                    {
                        Id = id,
                        Descricao = txtDescricaoProduto.Text
                    };
                }
                else
                {
                    var ret = ProdutoRepository.GetById(id);
                    txtDescricaoProduto.Text = ret.Descricao;
                    return ret;
                }
            }
        }

        private void ExibirDadosNaoVinculados()
        {

        }

        protected void cmdBuscarTransportadora_OnClick(object sender, EventArgs e)
        {

        }

        protected void cmdBuscaProduto_OnClick(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(txtDescricaoProduto.Text))
            {
                WebMsgBox.Show("Informe parte da descrição do produto.");
                return;
            }
            var list = ProdutoRepository.GetByDescricao(txtDescricaoProduto.Text);
            if (list.Count == 0)
            {
                WebMsgBox.Show("A busca não encontrou produtos com a descrição informada.");
                return;
            }
            if (list.Count > 1)
            {
                gridProduto.DataSourceID = "";
                gridProduto.DataSource = null;
                gridProduto.DataSource = list;
                gridProduto.DataBind();
                popProdutosEncontrados.ShowOnPageLoad = true;
            }
            else
            {
                txtIdProduto.Text = list[0].Id.ToString(CultureInfo.InvariantCulture);
            }

        }


        protected void gridProdutoNotaFiscal_OnRowDeleted(object sender, ASPxDataDeletedEventArgs e)
        {
            var sq = GetInt(e.Keys[0]);
            ProdutoNotaFiscal prodDel = null;
            for (int cont = 0; cont < Produtos.Count; cont++)
            {
                if (Produtos[cont].Sequencia == sq)
                {
                    prodDel = Produtos[cont];
                }
            }
            if (prodDel != null)
            {
                Produtos.Remove(prodDel);
            }
            AjustaSequenciaProdutoNotaFiscal();
            GridProdutoNotaFiscalBind();
        }

        protected void gridProduto_OnRowUpdated(object sender, ASPxDataUpdatedEventArgs e)
        {

        }

        protected void cmdAddProduto_OnClick(object sender, EventArgs e)
        {

            var prodNf = MontaProduto(new ProdutoNotaFiscal());
            if (prodNf == null)
            {
                return;
            }
            Produtos.Add(prodNf);
            AjustaSequenciaProdutoNotaFiscal();
            GridProdutoNotaFiscalBind();

        }

        private void GridProdutoNotaFiscalBind()
        {
            gridProdutoNotaFiscal.DataSource = null;
            gridProdutoNotaFiscal.DataSource = Produtos;
            gridProdutoNotaFiscal.DataBind();
        }

        private ProdutoNotaFiscal MontaProduto(ProdutoNotaFiscal prodNf)
        {
            if (String.IsNullOrEmpty(txtIdProduto.Text) || ProdutoSelecionado == null)
            {
                WebMsgBox.Show("Informe um produto para poder adicioná-lo à nota fiscal.");
                return null;
            }
            if (Ncm == null)
            {
                WebMsgBox.Show("Informe o NCM do produto.");
                return null;
            }
            if (Cst == null)
            {
                WebMsgBox.Show("Informe o CST do produto.");
                return null;
            }
            if (Cfop == null)
            {
                WebMsgBox.Show("Informe o CFOP do produto.");
                return null;
            }
            if (Unidade == null)
            {
                WebMsgBox.Show("Informe a unidade de entrada do produto.");
                return null;
            }

            var quantidade = GetDecimal(txtQuantidadeProduto.Text);
            var valor = GetDecimal(txtValorProduto.Text);
            if (quantidade == 0)
            {
                WebMsgBox.Show("Informe a quantidade do produto.");
                return null;
            }
            if (valor == 0)
            {
                WebMsgBox.Show("Informe o valor unitário do produto.");
                return null;
            }

            prodNf.Produto = ProdutoSelecionado;
            prodNf.NCM = Ncm;
            prodNf.CST = Cst;
            prodNf.CFOP = Cfop;
            prodNf.Unidade = Unidade;
            prodNf.Quantidade = quantidade;
            prodNf.ValorUnitario = valor;
            prodNf.ValorIpi = GetDecimal(txtIpiProduto.Text);
            prodNf.ValorIcms = GetDecimal(txtIcmsProduto.Text);

            return prodNf;
        }

        private void AjustaSequenciaProdutoNotaFiscal()
        {
            for (int cont = 0; cont < Produtos.Count; cont++)
            {
                Produtos[cont].Sequencia = cont + 1;
            }
        }

        protected void cmdAlterarProduto_OnClick(object sender, EventArgs e)
        {
            var sq = GetInt(txtSequenciaProduto.Text);
            if (String.IsNullOrEmpty(txtSequenciaProduto.Text) || sq == 0)
            {
                WebMsgBox.Show("Erro ao alterar produto... O número de sequência não foi informado.");
                return;
            }
            foreach (var prod in Produtos)
            {
                if (prod.Sequencia == sq)
                {
                    MontaProduto(prod);
                }
            }
            GridProdutoNotaFiscalBind();
        }



        private void SelecionaProduto()
        {
            txtIdProduto.Text = gridProduto.GetSelectedFieldValues("Id")[0].ToString();
            popProdutosEncontrados.ShowOnPageLoad = false;
            if(IsProdutoSelecionado()) cboNcmProduto.Focus();
        }


        protected void cmdSelecionarProduto_OnClick(object sender, EventArgs e)
        {
            SelecionaProduto();
        }
    }
}